package com.yujiahao.bigdata.rdd.action

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
    TODO 行动算子
      1、所谓行动的算子，就是通过调用RDD的方法，让RDD的计算开始执行，执行时，会让整个RDD模型的逻辑全部执行，
      2、如果不调用RDD的行动算子，那么逻辑无法执行
      3、collect 就是行动算子

    TODO 如何区分RDD的方法是一个转换算子，还是一个行动算子？
      1、转换算子一定是将旧的RDD转换为新的RDD，返回结果一定是RDD，
          转换算子可以将旧的RDD转换为新的RDD（这也不一定看底层实现的），但是不一定能转换（可能还是旧的）
      2、行动算子一定时让RDD的功能真正的执行，返回结果一定为具体的值，
        一个Spark程序中，可以生成作业，然后通过行动算子执行作业，只要触发行动算子的执行，那么就会产生一个新的作业(Job)。
      3、作业执行时，会将之前转换算子的功能全部执行一遍

 TODO reduce()行动算子参数说明:
      1、reduce(函数类型)  -->(Int, Int) => Int
      2、存在分区内操作，分区间操作
 */
object Spark01_Action {
  def main(args: Array[String]): Unit = {
    //TODO 1、获得Spark环境的连接
    // 参数解读：setAppName("当前执行程序的名字").setMaster("当前的环境")
    // 分布式环境的基本架构为 主 - 从
    val conf: SparkConf = new SparkConf().setAppName("WordCount").setMaster("local")
    val sc: SparkContext = new SparkContext(conf)
    //TODO 3、业务逻辑--测试reduce行动算子
    val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4, 5), 2)
    //行动算子结果一定为具体的一个值，reduce
    val i: Int = rdd.reduce(_ + _)
    println(i)

    //TODO 2、关闭Spark环境的连接
    sc.stop()

  }

}
